package com.runjian.rundo.iot.agent.common.message;

import java.nio.charset.StandardCharsets;

import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufUtil;

/**
 * 拆包后的完整消息，即通过tcp拆包，或者udp收到的一个完成的包，等其它收到的一个业务层完整的包内容
 *
 * @author LiGang
 */
public interface EncodedMessage {

    /**
     * 获取消息的负载
     *
     * @return 消息负载
     */
    ByteBuf getPayload();

    /**
     * 将消息的负载转化为字节数组
     *
     * @return 消息负载的字节数组
     */
    default byte[] payloadAsBytes() {
        return ByteBufUtil.getBytes(this.getPayload());
    }

    /**
     * 根据指定位置和长度的消息负载字节数组
     * 
     * @param offset 起始位置
     * @param len 读取长度
     * @return 消息负载字节数组
     */
    default byte[] getBytes(int offset, int len) {
        return ByteBufUtil.getBytes(this.getPayload(), offset, len);
    }

    /**
     * 将消息的负载转化为字符串
     *
     * @return 消息负载的字符串内容
     */
    default String payloadAsString() {
        return this.getPayload().toString(StandardCharsets.UTF_8);
    }

    /**
     * 将消息负载转化为google gson 的JsonObject
     *
     * @return 消息负载的google gson 的JsonObject
     */
    default JSONObject payloadAsJson() {
        return JSONObject.parseObject(this.payloadAsString());
    }

    /**
     * 将消息负载转化为google gson 的JsonArray
     *
     * @return 消息负载的google gson 的JsonArray
     */
    default JSONArray payloadAsJsonArray() {
        return JSONArray.parseArray(this.payloadAsString());
    }
}
